package cn.edu.sdjzu.knoverse.service;

import cn.edu.sdjzu.knoverse.model.entity.kg.ComponentNode;
import cn.edu.sdjzu.knoverse.model.entity.kg.FileNode;
import cn.edu.sdjzu.knoverse.model.entity.kg.KnowledgeNode;
import cn.edu.sdjzu.knoverse.model.vo.kg.FileInfoVo;

import java.util.List;
import java.util.Set;

public interface ComponentService {

    /**
     * 创建组件
     * @param component 组件信息
     * @param caseId 案例ID
     * @return 创建后的组件
     */
    ComponentNode createComponent(ComponentNode component, Long caseId);

    /**
     * 修改组件
     * @param component 组件信息
     * @return 修改后的组件
     */
    ComponentNode updateComponent(ComponentNode component);

    /**
     * 删除组件
     * @param id 组件ID
     */
    void deleteComponent(Long id);

    /**
     * 获取组件详情
     * @param id 组件ID
     * @return 组件详情
     */
    ComponentNode getComponent(Long id);

    /**
     * 获取案例下的所有组件
     * @param caseId 案例ID
     * @return 组件列表
     */
    Set<ComponentNode> getComponentsByCase(Long caseId);

    /**
     * 更新组件的附件文件
     * @param componentId 组件ID
     * @param fileIds 文件ID列表
     */
    void updateComponentFiles(Long componentId, List<Long> fileIds);
    
    /**
     * 获取组件的所有附件文件
     * @param componentId 组件ID
     * @return 文件列表
     */
    Set<FileNode> getComponentFiles(Long componentId);
    
    /**
     * 获取组件的所有附件文件的详细信息
     * @param componentId 组件ID
     * @return 文件信息列表
     */
    Set<FileInfoVo> getComponentFilesWithDetails(Long componentId);
    
    /**
     * 更新组件关联的知识点
     * @param componentId 组件ID
     * @param knowledgeIds 知识点ID列表
     */
    void updateRelatedKnowledge(Long componentId, List<Long> knowledgeIds);
    
    /**
     * 获取组件关联的所有知识点
     * @param componentId 组件ID
     * @return 知识点列表
     */
    Set<KnowledgeNode> getRelatedKnowledge(Long componentId);
    
    /**
     * 获取知识点关联的所有组件
     * @param knowledgeId 知识点ID
     * @return 组件列表
     */
    Set<ComponentNode> getComponentsByKnowledge(Long knowledgeId);
} 